iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 17

C - insecure direct object reference(存取控制:不安全的直接物件引用)

  • 分享至 

  • xImage
  •  

今天去了學校的秋徵,感想是覺得自己畢業就要失業了QQ(雖然能不能畢業也是個謎嗚嗚嗚嗚...)拜託誰來賜我高薪又能準時下班爽爽廢廢的工作 _(ˊxˋ 」_ )_

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

C - insecure direct object reference(存取控制:不安全的直接物件引用)

  • 形成原因:當應受保護的資產跳過安全機制被未經授權的使用者直接引用。
  • 後果:敏感資料外洩、惡意行為操作
  • 實例:一個個人財務應用程式允許使用者建立預算並追蹤消費及帳戶資料,然而應用程式未對後端API進行授權檢查,產生不安全的直接物件引用,只要在url中任意改變 userid 參數就能偽裝其他使用者請求
    https://app.financeapp.com/v1/ companies?userid =73625
  • 解決方法:
    • 確保行動裝置呼叫的後端API採取適當的存取控制
    • 使用不同授權的的使用者進行測試

第1題

錯誤區塊

auto fullName = filename;
std::ifstream infile(fullName);
if (infile.good() == false)
return false;
std::string stringFromFile;
std::vector<LocationObject> tempSituation;
std::vector<std::string> trackValues;
while(std::getline (infile,stringFromFile)) {
    if (infile.fail()) continue;
    trackValues.push_back(stringFromFile);
    if (trackValues.size() == DEFAULT_PARAMS_CNT)
    {
      if (!trackExists(trackValues.at(1)))
      {
        LocationObject obj;
        obj.setCallSign(trackValues.at(1));
        obj.setParameters(std::atoi(trackValues.at(2).data()),
                          std::atoi(trackValues.at(3).data()),
                          std::atof(trackValues.at(6).data()),
                          std::atoi(trackValues.at(5).data()),
                          std::atoi(trackValues.at(4).data()));
        tempSituation.push_back(obj);
        if (tempSituation.max_size() == tempSituation.size()) break;
      }
      trackValues.clear();
    }
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
輸入引數用於訪問讀取資料的檔案。 因此,可以訪問和讀取任何檔案並獲取其內容。 這允許攻擊者訪問敏感資訊

主要修正方法

把錯誤區塊改成

auto fullName = filename;
fullName.append(FILE_PREFIX);
std::ifstream infile(fullName);
if (infile.good() == false) return false;
std::string stringFromFile;
std::vector<LocationObject> tempSituation;
while(std::getline (infile,stringFromFile)) {
    if (infile.fail()) continue;
    std::istringstream sstream(stringFromFile);
    std::vector<std::string> trackValues;
    for (std::string value; std::getline(sstream, value, DELIMITER);)
    {
      trackValues.push_back(value);
      if (trackValues.size() > DEFAULT_PARAMS_CNT) break; 
    }
    if (trackValues.size() != DEFAULT_PARAMS_CNT)
    {
      std::cout << "\nThe \""<< filename << "\" is corrupted. Can't load." <<std::endl;
      return false;
    }
    if (trackExists(trackValues.at(1)))continue;
    LocationObject obj;
    obj.setCallSign(trackValues.at(1));
    obj.setParameters(stoi(trackValues.at(2)),stoi(trackValues.at(3)),
                      stod(trackValues.at(6)),stoi(trackValues.at(5)),
                      stoi(trackValues.at(4)));
    tempSituation.push_back(obj);
    if (tempSituation.max_size() == tempSituation.size()) break;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
建議為檔案使用具有辨識性的名稱和自定義的內容格式。 因此,通過為檔案新增唯一的副檔名,並實現自定義的資料儲存格式與檢查機制,可以限制惡意行為者的存取。


上一篇
C - missing function level access control (存取控制:遺漏功能層級存取控制)
下一篇
C - uncaught error (拒絕服務:未被捕獲的錯誤)
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言